 //===================================================== Configuration ============================================
#include <avr/io.h>
#include <stdlib.h> 

void setup();
void loop();
void structure_G7();
void set_bit(volatile char* p, int num_case, char num_Bit, int valeur);
char get_bit(volatile char* p,int num_case, char num_Bit);
void copyTab(volatile char* tabSrc, volatile char* tabDst,int dim);
#line 13
volatile int NB_etapes = 2;
      volatile int dim_tab_etape = ((int)(NB_etapes /8)+1);
      volatile char* tab_etape = (volatile char * )malloc(dim_tab_etape);
      //Configuration transition
      volatile int r1 =0;
      volatile int r2 =0;
      // d\u00e9finition des variables
      volatile char CopyPIN[3];
      volatile char SORT[3];
      volatile char ENT[3] ;
      volatile char CmdSort[3];
      volatile char* Copie_etape = (volatile char*)malloc(dim_tab_etape);
      volatile char* Etat_fin = (volatile char*)malloc(dim_tab_etape);


// ======================================================= Main =====================================================

int main()
{
    setup();
    while(1){
        loop();
    }
	return 0;
}

// ======================================================= SETUP =====================================================

void setup(){
	
        tab_etape[0] = 0B00000001;

        for( int i = 0 ; i < 3; i++)
        {
          SORT[i] = 0B00000000;
          ENT[i] = 0B11111111;
          CmdSort[i] = 0B00000000;
        }

  // ------initialisation des sorties----
      // \u00e9criture des variable de sortie:
          //variable de sortie port B

           set_bit(SORT,0,1,1);
          //...
          //variable de sortie port C
          //...
          //variable de sortie port D

          set_bit(SORT,2,4,1);
          set_bit(SORT,2,5,1);
          set_bit(SORT,2,6,1);
          //...
      // intialisation des port en sortie

          DDRB |= SORT[0];
          DDRC |= SORT[1];
          DDRD |= SORT[2];
 //------fin initialisation des sorties -----



  //------ Configuration des entree -----

		  //variable de entr\u00e9e port B
		  //...
          //variable de entr\u00e9e port C
          set_bit(ENT,1,5,0);
          set_bit(ENT,1,4,0);
          //variable de entr\u00e9e port D
		  //...

			DDRB &= ENT[0];
			DDRC &= ENT[1];
			DDRD &= ENT[2];

  //------ fin Configuration des entree -----

  //------\u00e9criture des sorties en initialisation (si besoin)-----
        PORTC |= 0x30;
  //------------------fin \u00e9criture des sorties -----------


}




void loop()
{

      //-----------Lecture de toutes les entr\u00e9es (Copie)-------

          // premier principe automate: lire les entr\u00e8es.
          CopyPIN[0] = PINB;
          CopyPIN[1] = PINC;
          CopyPIN[2] = PIND;
          //--------- rep\u00e9rage des receptivit\u00e9s  -------
           r1=!get_bit(CopyPIN,1,5);
           r2=!get_bit(CopyPIN,1,4);
           //------------Structure graphcet --------------
           structure_G7();
           //------------ fin Structure graphcet --------------


         if ( get_bit(tab_etape,0,0) ==1)
        	  {
                     // a faire ici ou en "ecriture des Sortie"
                     // initialisation des variable de sortie
                    set_bit(CmdSort,2,4,1);
                     set_bit(CmdSort,2,6,0);
                     // fin initialisation des variable de sortie
        	  }

          if ( get_bit(tab_etape,0,1) ==1)
        	  {
                      // a faire ici ou en "ecriture des Sortie"
                      // initialisation des variable de sortie
                      set_bit(CmdSort,2,6,1);
                      set_bit(CmdSort,2,4,0);
                      // fin initialisation des variable de sortie
        	  }

          //----------------ecriture des Sortie -------------
          // /!\ fonctionnement monostable /!\ remet toutes lses sortie \u00e0 z\u00e9ro ne prend pas en compte les \u00e9tats initiaux des sorties .. erreur.TXT chap1

          PORTB = (PORTB & (~SORT[0])) | (SORT[0] & CmdSort[0]);
          PORTC = (PORTC & (~SORT[1])) | (SORT[1] & CmdSort[1]);
          PORTD = (PORTD & (~SORT[2])) | (SORT[2] & CmdSort[2]);

}

// fonction de la sctructur du G7
void structure_G7()
{

          copyTab(tab_etape,Etat_fin,dim_tab_etape);
          char diff = false;
	  do {
                 copyTab(Etat_fin,Copie_etape,dim_tab_etape);
                 diff = false;

		  if( get_bit(Copie_etape,0,0) && r1)
        		  {
        		      set_bit(Etat_fin,0,0,0);
        		      set_bit(Etat_fin,0,1,1);
        		  }

                  if( get_bit(Copie_etape,0,1) && r2 )
        		  {
        		      set_bit(Etat_fin,0,0,1);
        		      set_bit(Etat_fin,0,1,0);
        		  }

                  int j  = 0;

                  do
                      {
                          diff = Copie_etape[j] != Etat_fin[j] ;
                          j= j+1;
                      }while (j<dim_tab_etape && diff == false);

	      }while(diff);

	  for (int i = 0;i < dim_tab_etape ;i=i+1)
              {
                 tab_etape[i] = Etat_fin[i];
              }

         copyTab(Etat_fin,tab_etape,dim_tab_etape);

         return;
}



void set_bit(volatile char* p, int num_case, char num_Bit, int valeur)
{
	if (valeur == 1)
        	{
        	    p[num_case] |= 1<<num_Bit;;
        	    return;
        	}
	else if  (valeur == 0)
        	{
        	    p[num_case] &= ~(1<<num_Bit);
                    return;
        	}
}

 char get_bit(volatile char* p,int num_case, char num_Bit){
	return (p[num_case]>>num_Bit) & 0x0001;
}

void copyTab(volatile char* tabSrc, volatile char* tabDst,int dim)
{
       for(int i = 0; i < dim; i++)
           {
              tabDst[i]=tabSrc[i];
           }
}


